package org.dxy.trigger.http.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dxy.api.dto.request.substitute.*;
import org.dxy.api.dto.response.R;
import org.dxy.infrastructure.persistent.po.query.SubstituteMaterialViewPo;

import java.util.List;

/**
 * 替代料应用服务接口
 * @author dxy
 * @createTime 2025/9/13
 */
public interface SubstituteMaterialApplicationService {
    
    /**
     * 添加替代料
     */
    R<Void> add(AddSubstituteMaterialRequest request);
    
    /**
     * 更新替代料
     */
    R<Void> update(Long id, UpdateSubstituteMaterialRequest request);
    
    /**
     * 移除替代料
     */
    R<Void> remove(Long id);
    
    /**
     * 审核通过替代料
     */
    R<Void> approve(Long id);
    
    /**
     * 审核拒绝替代料
     */
    R<Void> reject(Long id, RejectSubstituteMaterialRequest request);
    
    /**
     * 工单应用替代料
     */
    R<Void> applyToWorkOrder(Long id, ApplySubstituteMaterialToWorkOrderRequest request);
    
    /**
     * 分页查询替代料列表
     */
    R<Page<SubstituteMaterialViewPo>> list(Page<SubstituteMaterialViewPo> page, SubstituteMaterialViewPo query);
    
    /**
     * 根据ID查询替代料详情
     */
    R<SubstituteMaterialViewPo> getById(Long id);
    
    /**
     * 根据MBOM ID查询替代料列表
     */
    R<List<SubstituteMaterialViewPo>> getByMbomId(Long mbomId);
    
    /**
     * 根据MBOM项ID查询替代料列表
     */
    R<List<SubstituteMaterialViewPo>> getByMbomItemId(Long mbomItemId);
    
    /**
     * 根据状态查询替代料列表
     */
    R<List<SubstituteMaterialViewPo>> getByStatus(String status);
    
    /**
     * 根据主料编码查询替代料列表
     */
    R<List<SubstituteMaterialViewPo>> getByMainMaterialCode(String mainMaterialCode);
    
    /**
     * 根据替代料编码查询替代料列表
     */
    R<List<SubstituteMaterialViewPo>> getBySubstituteMaterialCode(String substituteMaterialCode);
    
    /**
     * 查询可用的替代料
     */
    R<List<SubstituteMaterialViewPo>> getAvailableSubstitutes(Long mbomItemId);
}